from xml.dom import minidom
import time
import re
from collections import namedtuple
from mergejoin import mergejoin
from hashjoin import hashjoin

class SGBD():
    
    def __init__(self):
        self.autoresXML = minidom.parse(open('xml/autores.xml')).childNodes[0].getElementsByTagName('autor')
        self.livrosXML = minidom.parse(open('xml/livros.xml')).childNodes[0].getElementsByTagName('livro')
        
#         namedtuple eh igual a uma mini classe, somente com atributos sem metodos
        self.Autor = namedtuple('Autor', 'id nome idade premiado')
        self.Livro = namedtuple('Livro', 'id titulo editora idautor ano edicao numPaginas premiado formato')
        
        self.autores = []
        self.livros = []
        
        self.setAutoresList()
        self.setLivrosList()
               
    def printAutores(self):
        print "\n  AUTORES:"
        for a in self.autores:
            print "#"*40
            for c in a:
                print c
            
    def printLivros(self):
        print "\n  LIVROS:"
        for l in self.livros:
            print "#"*40
            for c in l:
                print c
    # Le o XML e popula a lista de autor
    def setAutoresList(self):
        for a in self.autoresXML:
            id = int(a.getElementsByTagName('id')[0].childNodes[0].data)
            nome = a.getElementsByTagName('nome')[0].childNodes[0].data
            idade = int(a.getElementsByTagName('idade')[0].childNodes[0].data)
            premiado = int(a.getElementsByTagName('premiado')[0].childNodes[0].data)
            self.autores += [self.Autor(id, nome, idade,premiado)]
    
    # Le o XML e popula a lista de livro
    def setLivrosList(self):
        for l in self.livrosXML:
            id = int(l.getElementsByTagName('id')[0].childNodes[0].data)
            tit = l.getElementsByTagName('titulo')[0].childNodes[0].data
            edi = l.getElementsByTagName('editora')[0].childNodes[0].data
            idA = int(l.getElementsByTagName('idautor')[0].childNodes[0].data)
            ano = int(l.getElementsByTagName('ano')[0].childNodes[0].data)
            edicao = int(l.getElementsByTagName('edicao')[0].childNodes[0].data)
            numPag = int(l.getElementsByTagName('numeroPaginas')[0].childNodes[0].data)
            premiado = int(l.getElementsByTagName('premiado')[0].childNodes[0].data)
            formato = l.getElementsByTagName('formato')[0].childNodes[0].data
            self.livros += [self.Livro(id, tit,edi,idA,ano,edicao,numPag,premiado,formato)]
            
    def hashjoin(self, cond):
        t = time.time()
        a = hashjoin(self.livros,self.autores,cond)
        return [a,time.time() -t]

    def mergejoin(self, cond):    
        t = time.time()
        a = mergejoin(self.livros,self.autores,cond)
        return [a,time.time() -t]

def main():
    data = SGBD()

    print "*#"*40
    print "#"*5," "*5,"Algoritmos de MergeJoin e Hash Join para Banco de Dados II"
    print "#"*5," "*5,"Joao Ricardo, Felipe Docil, Carla Carvalho"
    print "*#"*40
    print ""
    while True:
        do = True
        while do:
            try:
                print "\n # ","Menu:"
                print " # ","1 - Ver tabelas"
                print " # ","2 - Join..."
                print " # ","3 - Sair..."
                c = int(raw_input("(1-3) -> "))
                do = False
            except:
                print "Digite um numero de 1-2"
        if c == 1:
            data.printAutores()
            data.printLivros()
        elif c == 2:
            print "\n Join..."
            print "## Tabela Livros: (i - attr)"
            kl = re.findall("([a-zA-Z_]+)=",data.livros[0].__repr__())
            for i in range(len(kl)):
                print i," - ",kl[i]
            print "\n## Tabela Autores: (i - attr)"
            ka = re.findall("([a-zA-Z_]+)=",data.autores[0].__repr__())
            for i in range(len(ka)):
                print i," - ",ka[i]
           
            cond = []
            while True:
                print ""
                print "Digite a condicao no formato (x,y)(x1,y1)"
                print "i.e: (3,0) = WHERE livro.idautor = autor.id"
                c = raw_input("(Condicao:) -> ")
                try:
                    ipt = re.findall("\d+",c)
                    for i in range(len(ipt)):
                        ipt[i] = int(ipt[i])
                    if not len(cond) % 2 == 0:
                        1/0
                    for i in range(0,len(ipt),2):
                        cond +=  [ipt[i:i+2]]
                    break
                except:
                    print "Digite as condicoes de modo correto... (x,y) - x- i Livro, y- i autor"
            t = time.time()
            print "HJ: ",len(hashjoin(data.livros,data.autores,cond))
            print "HJ: ",str(time.time() -t)
            t = time.time()
            print "MJ: ",len(mergejoin(data.livros,data.autores,cond))
            print "MJ: ",str(time.time() -t)

        elif c == 3:
            break
    print " # Saindo..."
